#ifndef SDKINTERFACE_H
#define SDKINTERFACE_H

#include <QObject>
#include <QtPlugin>
#include <QString>
#include <QList>
#include <QDialog>
#include <QWidget>

// 触发模式宏定义
#define TRIGGER_MODE_CONTINUOUS 0    // 连续采集
#define TRIGGER_MODE_EXTERNAL_SINGLE 1 // 单次外触发
#define TRIGGER_MODE_EXTERNAL_CONTINUOUS 2 // 连续外触发
#define TRIGGER_MODE_INTERNAL 3        // 内触发

// 声明接口ID
#define SDKINTERFACE_IID "Camera.SDKInterface/1.0"

class SDKInterface : public QObject {
    Q_OBJECT
public:
    explicit SDKInterface(QObject *parent = nullptr):QObject(parent){}
    virtual ~SDKInterface() = default;
    enum class DeviceType
    {
        Camera,        // 相机设备
        ControlModule    // 控制模块设备
    };
    /**
     * @brief 获取设备类型
     * @return 设备类型枚举值
     */
    DeviceType deviceType(){return  m_DeviceType;}
    /**
     * @brief 获取SDK名称（硬件厂家唯一标识）
     * @return SDK名称字符串
     */
    virtual QString sdkName() const = 0;

    /**
     * @brief 获取SDK版本信息
     * @return 版本号字符串
     */
    virtual QString SDKVersion() const = 0;

    /**
     * @brief 打开设备连接
     * @param params 连接参数，通常为设备IP地址
     * @return 连接成功返回true，失败返回false
     */
    virtual bool openDevice(const QVariant& params) = 0;

    /**
     * @brief 关闭指定设备连接
     * @param params 设备标识参数，通常为设备IP地址
     */
    virtual void closeDevice(const QVariant& params) = 0;

    /**
     * @brief 关闭所有设备连接
     */
    virtual void closeAllDevices() = 0;
    
    /**
     * @brief 搜索可用设备
     * @param devices 输出参数，用于存储搜索到的设备列表
     * @return 搜索成功返回true，未找到设备返回false
     */
    virtual bool searchDevices(QList<QVariant>& devices) = 0;
    
    /**
     * @brief 设置设备触发模式
     * @param deviceId 设备ID
     * @param triggerMode 触发模式，使用TRIGGER_MODE_*宏定义
     * @return 设置成功返回true，失败返回false
     */
    virtual bool setDeviceTriggerMode(const QVariant& deviceId, int triggerMode) = 0;
    
    /**
     * @brief 设置设备参数
     * @param deviceId 设备ID
     * @param params 设备参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    virtual bool setDeviceParameters(const QVariant& deviceId, const QVariantMap& params) = 0;
    
    /**
     * @brief 获取设备参数
     * @param deviceId 设备ID
     * @param configName 配置名称输出
     * @param params 设备参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    virtual bool getDeviceParameters(const QVariant& deviceId, QString& configName, QVariantMap& params) = 0;
    
    /**
     * @brief 设置预设参数
     * @param params 预设参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    virtual bool setPresetParameters(const QVariantMap& params) = 0;
    
    /**
     * @brief 获取预设参数
     * @param configName 配置名称输出
     * @param params 预设参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    virtual bool getPresetParameters(QString& configName, QVariantMap& params) = 0;

signals:

    /**
     * @brief 日志写入信号
     * @param logInfo 日志信息
     * @param logLevel 日志级别（默认0）
     * @param isSave 是否保存到文件（默认false）
     */
    void writeLog(const QString& logInfo,int logLevel=0,bool isSave=false);
    
protected:
    // 设备类型
    DeviceType m_DeviceType;
};

Q_DECLARE_INTERFACE(SDKInterface, SDKINTERFACE_IID)

#endif // SDKINTERFACE_H
